package stack_opt

import (
	"Yasuo/iface/istack_opt"
	"Yasuo/iface/iyasuo"
	"Yasuo/utils"
)

func FactorySatrt(tv string)  (istack_opt.IStackOpt) {
	switch tv {
	case "", " ":
		return NewSubexpressionStart()
	default:
	}

	return nil
}

// 左括号 ( 开始，入栈opt，作为结束标识
type SubexpressionStart struct{}

func NewSubexpressionStart() *SubexpressionStart {
	return &SubexpressionStart{}
}

func (SubexpressionStart) InventedOpt(iys iyasuo.IYasuo) error {
	var (
		u *utils.Utils
	)

	u = utils.NewUtils()
	u.PushBack(iys.GetOPT(), "(")

	iys.SetNext(iys.GetNext()+1)

	return nil
}

// 普通开始
type StartCommon struct{}

func NewStarCommon() *StartCommon {
	return &StartCommon{}
}

func (StartCommon) InventedOpt(iys iyasuo.IYasuo) error {
	iys.SetNext(iys.GetNext() + 1)
	return nil
}

// if函数
type IfOpt struct{}

func NewIfOpt() *IfOpt {
	return &IfOpt{}
}

// 1. 后面结构计算必然是bool
// 2. true: 找then
// 3. fasle: 找
// 4. 在if函数后面，必然是返回float64的函数或者是float64纯数字
// 碰到第一个stop就返回
func (i *IfOpt) InventedOpt(iys iyasuo.IYasuo) error {
	//var (
	//	tokens []efp.Token
	//	next int
	//	left float64
	//	right float64
	//	err error
	//	ii istack_opt.IStackOpt
	//	lgopt interface{} // 逻辑运算符
	//	slgopt string
	//	one interface{}
	//	fone float64
	//	two interface{}
	//	ftwo float64
	//	u *utils.Utils
	//)
	//
	//u = utils.NewUtils()
	//tokens = iys.GetTokens()
	//next = iys.GetNext() + 1
	//
	//// 1. 直到碰到 ""时候退出，意思就是下一个碰到then了
	//for tokens[next].TValue != "" {
	//	// 执行工厂的策略就可以
	//	if ii, err = FactoryStackOpt(tokens[next]); err != nil {
	//		return err
	//	}
	//	if err = ii.InventedOpt(iys); err != nil {
	//
	//	}
	//	next = iys.GetNext()
	//}
	//// 2. 把逻辑操作符提取出来1个
	//if lgopt, err = u.RemoveLast(iys.GetOPT()); err != nil {
	//	return err
	//}
	//// 3. 操作数提取出来两个
	//if one, err = u.RemoveLast(iys.GetOPD()); err != nil {
	//	return err
	//}
	//if two, err = u.RemoveLast(iys.GetOPT()); err != nil {
	//	return err
	//}
	//// 4. 进行断言




	return nil
}


